"""
@Description: 生成测试用例需要的一些假数据
@File: fake_data.py
"""
import datetime

from faker import Faker
import random
import string


fake = Faker()


def fake_engine_no():
    """
    返回一个发动机号
    :return:
    """
    chars = [
        random.choice(string.ascii_uppercase + string.digits) for x in range(8)
    ]
    return ''.join(chars)


def fake_vin():
    """
    生成随机的车架号(符合程序清洗规则)
    :return: 车架号(类型 str)
    """
    first_part_chars = 'ABCDEFGHJKLMNPRSTUVWXYZ0123456789'
    last_part_chars = '0123456789'
    vin_chars = []
    for i in range(12):
        vin_chars.append(random.choice(first_part_chars))
    for i in range(5):
        vin_chars.append(random.choice(last_part_chars))

    return ''.join(vin_chars)


def fake_plate_num():
    """
    生成随机的车牌号(符合程序清洗规则)
    :return: 车牌号(类型 str)
    """
    char0 = [
        "京", "津", "沪", "渝", "冀", "豫", "云", "辽", "黑", "湘", "皖", "鲁", "新", "苏",
        "浙", "赣", "鄂", "桂", "甘", "晋", "蒙", "陕", "吉", "闽", "赣", "粤", "青", "藏",
        "川", "宁", "琼"
    ]  # 省份简称
    char1 = 'ABCDEFGHJKLMNPQRSTUVWXYZ'  # 车牌号中没有I和O
    char2 = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ'

    id_1 = random.choice(char0)  # 车牌号第一位     省份简称
    id_2 = ''.join(random.sample(char1, 1))  # 车牌号第二位

    while True:
        id_3 = ''.join(random.sample(char2, 5))
        if not id_3.isalpha():
            car_id = id_1 + id_2 + id_3
            break

    return car_id


def fake_order_no():
    """
    返回一个保单号
    :return:
    """
    first_part = ''.join(
        [random.choice(string.ascii_uppercase) for x in range(4)])
    second_part = random.randint(2010, 2021)
    third_part = ''.join([random.choice(string.digits) for x in range(14)])
    return f'{first_part}{second_part}{third_part}'


def fake_insurance_company():
    """
    返回一个保险公司名
    :return:
    """
    names = [
        '中国人保', '中国平安', '太平洋保险', '中国人寿', '大地保险', '中华联合', '阳光保险', '中国太平',
        '新华保险', '泰康保险'
    ]
    return random.choice(names)


def fake_sum_assured():
    """
    返回一个保额
    :return: int
    """
    return random.choice([50, 100, 200, 300, 400]) * 10000


def fake_car_premium():
    """
    返回一个总保费
    :return: float
    """
    return random.randint(3000, 20000) + round(random.random(), 2)


def fake_car_model():
    """
    返回一个车型
    :return: str
    """
    car_models = [
        '2022款 改款 华晨宝马320Li M运动套装', '2022款 华晨宝马320Li M运动套装',
        '2022款 改款 华晨宝马320i 运动套装', '2022款 华晨宝马320i 运动套装',
        '奥迪A4L 2022款 40 TFSI 豪华动感型', '奥迪A4L 2022款 40 TFSI 豪华动感型'
    ]
    return random.choice(car_models)


def fake_car_series():
    """
    返回一个车系
    :return: str
    """
    car_models = ['宝马3系', '奥迪A4', '奥迪A6', '丰田凯美瑞']
    return random.choice(car_models)


class FakeData:
    """
    假客户数据
    """
    fake = Faker(locale='zh_CN')

    def fake_ssn(self):
        """
        返回一个身份证号码
        :return: str
        """
        while True:
            ssn_no = self.fake.ssn(min_age=25, max_age=45)
            if ssn_no[0] in '123456':
                return ssn_no

    def fake_phone(self):
        """
        返回一个手机号码
        :return: str
        """
        return self.fake.phone_number()

    def fake_email(self, domain=None):
        """
        返回一个邮箱地址
        :param domain: 可选参数，指定邮箱的域名，如 'example.com'
        :return: str
        """
        if domain:
            return self.fake.ascii_free_email(domain=domain)
        return self.fake.ascii_free_email()


    def fake_date(self):
        """
        返回一个日期
        :return:
        """
        return self.fake.date('%Y/%m/%d')

    def generate_future_date(self):
        """
        使用Faker生成一个大于当前日期的日期
        :return: 大于当前日期的日期字符串
        """
        today = datetime.date.today()
        future_date = today + datetime.timedelta(days=1)  # 生成明天的日期作为大于当前日期的日期
        return future_date.strftime('%Y-%m-%d')



    def fake_datetime(self):
        """
        返回一个2024-04-21 11:48:00格式的日期时间
        :return:
        """
        # dt_obj = self.fake.date_time_this_month(before_now=False, after_now=False)
        #
        # rounded_seconds = round(dt_obj.second)  # 四舍五入到整数秒
        # dt_obj = dt_obj.replace(second=rounded_seconds)
        # return dt_obj

        now = datetime.datetime.now()
        rounded_seconds = int(now.second)  # 向下取整到整数秒
        now = now.replace(second=rounded_seconds)
        return now.strftime('%Y-%m-%d %H:%M:%S')

    def fake_name(self):
        """
        返回一个人名
        :return:
        """
        return self.fake.name()

    def fake_address(self):
        """
        返回一个地址
        :return:
        """
        return self.fake.address()

    def fake_str(self, num: int):
        """
        返回一个指定长度的字符串
        """
        chars = [
            random.choice(string.ascii_lowercase + string.ascii_uppercase +
                          string.digits) for x in range(num)
        ]
        return ''.join(chars)

    def fake_engine_no(self):
        """
        返回一个发动机号
        :return:
        """
        chars = [
            random.choice(string.ascii_uppercase + string.digits) for x in range(8)
        ]
        return ''.join(chars)

    def fake_vin(self):
        """
        生成随机的车架号(符合程序清洗规则)
        :return: 车架号(类型 str)
        """
        first_part_chars = 'ABCDEFGHJKLMNPRSTUVWXYZ0123456789'
        last_part_chars = '0123456789'
        vin_chars = []
        for i in range(12):
            vin_chars.append(random.choice(first_part_chars))
        for i in range(5):
            vin_chars.append(random.choice(last_part_chars))

        return ''.join(vin_chars)

    def fake_plate_num(self):
        """
        生成随机的车牌号(符合程序清洗规则)
        :return: 车牌号(类型 str)
        """
        char0 = [
            "京", "津", "沪", "渝", "冀", "豫", "云", "辽", "黑", "湘", "皖", "鲁", "新", "苏",
            "浙", "赣", "鄂", "桂", "甘", "晋", "蒙", "陕", "吉", "闽", "赣", "粤", "青", "藏",
            "川", "宁", "琼"
        ]  # 省份简称
        char1 = 'ABCDEFGHJKLMNPQRSTUVWXYZ'  # 车牌号中没有I和O
        char2 = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ'

        id_1 = random.choice(char0)  # 车牌号第一位     省份简称
        id_2 = ''.join(random.sample(char1, 1))  # 车牌号第二位

        while True:
            id_3 = ''.join(random.sample(char2, 5))
            if not id_3.isalpha():
                car_id = id_1 + id_2 + id_3
                break

        return car_id

    def fake_order_no(self):
        """
        返回一个保单号
        :return:
        """
        first_part = ''.join(
            [random.choice(string.ascii_uppercase) for x in range(4)])
        second_part = random.randint(2010, 2021)
        third_part = ''.join([random.choice(string.digits) for x in range(14)])
        return f'{first_part}{second_part}{third_part}'

    def fake_insurance_company(self):
        """
        返回一个保险公司名
        :return:
        """
        names = [
            '中国人保', '中国平安', '太平洋保险', '中国人寿', '大地保险', '中华联合', '阳光保险', '中国太平',
            '新华保险', '泰康保险'
        ]
        return random.choice(names)

    def fake_sum_assured(self):
        """
        返回一个保额
        :return: int
        """
        return random.choice([50, 100, 200, 300, 400]) * 10000

    def fake_car_premium(self):
        """
        返回一个总保费
        :return: float
        """
        return random.randint(3000, 20000) + round(random.random(), 2)

    def fake_car_model(self):
        """
        返回一个车型
        :return: str
        """
        car_models = [
            '2022款 改款 华晨宝马320Li M运动套装', '2022款 华晨宝马320Li M运动套装',
            '2022款 改款 华晨宝马320i 运动套装', '2022款 华晨宝马320i 运动套装',
            '奥迪A4L 2022款 40 TFSI 豪华动感型', '奥迪A4L 2022款 40 TFSI 豪华动感型'
        ]
        return random.choice(car_models)

    def fake_car_series(self):
        """
        返回一个车系
        :return: str
        """
        car_models = ['宝马3系', '奥迪A4', '奥迪A6', '丰田凯美瑞']
        return random.choice(car_models)

    def fake_domain(self):
        """
        返回一个域名
        :return: str
        """
        # 定义可用于生成域名部分的字符集，包含大小写字母和数字
        valid_characters = string.ascii_letters + string.digits
        # 随机生成域名的长度，范围在12 - 15位之间
        domain_length = random.randint(12, 15)
        domain = ''.join(random.choice(valid_characters) for _ in range(domain_length))
        return domain

    def generate_english_username(self):
        """
        生成 6 - 12 位的英文用户名
        """
        while True:
            username = self.fake.user_name()
            # 只保留用户名中的字母和数字
            filtered_username = ''.join(filter(str.isalnum, username))
            # 检查用户名是否为英文且长度在 6 - 12 位之间
            if filtered_username.isalpha() and 6 <= len(filtered_username) <= 12:
                return filtered_username

    def generate_password(self,min=12, max=18):
        """
        随机生成1个12位到15位的包含大小写字母和数字的密码
        :return: 生成的密码
        """
        password_length = random.randint(min, max)

        # 确保密码包含至少一个大写字母、一个小写字母和一个数字
        upper = random.choice(string.ascii_uppercase)
        lower = random.choice(string.ascii_lowercase)
        digit = random.choice(string.digits)

        # 生成剩余的随机字符
        remaining_length = password_length - 3
        remaining_characters = ''.join(random.choices(string.ascii_letters + string.digits, k=remaining_length))

        # 组合所有字符并打乱顺序
        password = upper + lower + digit + remaining_characters
        password = ''.join(random.sample(password, len(password)))  # 打乱顺序

        return password


Fake = FakeData()

def fake_name_list():
    """
    返回一个随机的名字列表
    :return:
    """
    usernames = [
        # 纯中文用户名
        Fake.fake_name(),
        # 纯字母用户名
        fake.user_name(),
        # 纯数字用户名
        # 纯数字用户名
        str(fake.random_int(min=100000, max=999999)),
        # 包含数字的用户名
        fake.user_name() + str(fake.random_int(min=1, max=100)),
        # 包含特殊字符的用户名
        fake.user_name() + fake.pystr(min_chars=1, max_chars=3),
        # 全大写字母用户名
        fake.user_name().upper(),
        # 全小写字母用户名
        fake.user_name().lower(),
        # 包含空格的用户名
        f"{fake.user_name()} {fake.user_name()}"
    ]
    return usernames

if __name__ == '__main__':
    # print(fake_vin())
    # print(Fake.fake_sum_assured())
    # print(Fake.fake_datetime())
    print(Fake.fake_domain())
    print(fake_name_list())

